//package com.ruibang.glass.produce.component.job;
//
//import com.ruibang.glass.common.domain.quality.HotGlassDefectNum;
//import com.ruibang.glass.produce.domain.resp.OperateHotQualityInfo;
//import com.ruibang.glass.produce.entity.OperateQuality;
//import com.ruibang.glass.produce.domain.resp.OperateQualityDefectInfo;
//import com.ruibang.glass.produce.mapper.OperateQualityMapper;
//import com.ruibang.glass.produce.mapper.ProduceOperateMapper;
//import com.teaming.cloud.framework2.elastic.job3.annotation.ElasticJobScheduler;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections4.CollectionUtils;
//import org.apache.shardingsphere.elasticjob.api.ShardingContext;
//import org.apache.shardingsphere.elasticjob.simple.job.SimpleJob;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//import java.math.BigDecimal;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.ZoneOffset;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @Author: songJinKang
// * @CreateTime: 2024-04-08  16:19
// * @Description: TODO 生产经营质量细信息任务
// * @Version: 1.0
// */
//
//@Slf4j
//@Component
//@ElasticJobScheduler(cron = "4 20 7 * * ?")
////@ElasticJobScheduler(cron = "0 * * * * ?")
//public class ProduceOperateTask implements SimpleJob {
//
//    @Autowired
//    private ProduceOperateMapper produceOperateMapper;
//    @Autowired
//    private OperateQualityMapper operateQualityMapper;
//
//    @Override
//    public void execute(ShardingContext shardingContext) {
//        OperateQuality operateQualityInfo = getOperateQualityInfo();
//        log.error("operateQualityInfo:{}", operateQualityInfo);
//        operateQualityMapper.insert(operateQualityInfo);
//    }
//
//    public OperateQuality getOperateQualityInfo() {
//        LocalDate date = LocalDate.now();
//        LocalDateTime endTime = LocalDateTime.of(date.getYear(), date.getMonthValue(), date.getDayOfMonth(), 7, 0, 0);
//        LocalDateTime startTime = endTime.minusDays(1);
//        log.error("生产经营质量任务 dayTime: {}----{}", startTime, endTime);
//        long start;
//        long end;
//        end = endTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
//        start = startTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
//        //热端质量数据
//        OperateHotQualityInfo operateHotQualityInfo = produceOperateMapper.getOperateHotQualityInfo(start, end);
//        log.error("hot:{}", operateHotQualityInfo);
//        //质量数据
//        OperateQuality qInfo = produceOperateMapper.getOperateQualityInfo(startTime, endTime);
//        log.error("info:{}", qInfo);
//        if (operateHotQualityInfo != null) {
//            qInfo.setHqNum(operateHotQualityInfo.getHqNum());
//            qInfo.setBcpZtNum(operateHotQualityInfo.getBcpZtNum());
//            qInfo.setBcpSbNum(operateHotQualityInfo.getBcpSbNum());
//        }
//        //当月收包良品数
//        int monthSbLpNum = produceOperateMapper.getMonthSbLpNum(startTime, endTime);
//        qInfo.setMonthSbLpNum(monthSbLpNum);
//        //直投良品率
//        if (qInfo.getZtNum() > 0 && qInfo.getZtLpNum() > 0) {
//            qInfo.setZtLpRate(divideAndRound(qInfo.getZtLpNum(), qInfo.getZtNum()));
//        }
//        //再清洗收包率
//        if (qInfo.getZtNum() > 0 && qInfo.getZqxLpNum() > 0) {
//            qInfo.setZqxSbRate(divideAndRound(qInfo.getZqxLpNum(), qInfo.getZtNum()));
//        }
//        //收包投良品率
//        if (qInfo.getSbtNum() > 0 && qInfo.getSbtLpNum() > 0) {
//            qInfo.setSbtLpRate(divideAndRound(qInfo.getSbtLpNum(), qInfo.getSbtNum()));
//        }
//        //在清洗良品率
//        if (qInfo.getZqxNum() > 0 && qInfo.getZqxLpNum() > 0) {
//            qInfo.setZqxLpRate(divideAndRound(qInfo.getZqxLpNum(), qInfo.getZqxNum()));
//        }
//        //成品返投良品率
//        if (qInfo.getCpftNum() > 0 && qInfo.getCpftLpNum() > 0) {
//            qInfo.setCpftLpRate(divideAndRound(qInfo.getCpftLpNum(), qInfo.getCpftNum()));
//        }
//
//        //直投缺陷
//        List<OperateQualityDefectInfo> allDefectData = new ArrayList<>();
//        List<OperateQualityDefectInfo> ztDefectData = produceOperateMapper.getZtDefect(startTime, endTime);
//        if (CollectionUtils.isNotEmpty(ztDefectData)) {
//            allDefectData.addAll(ztDefectData);
//            qInfo.setZtDefect(ztDefectData);
//            processDefectRate(ztDefectData, qInfo.getZtNum());
//        } else {
//            qInfo.setZtDefect(Collections.emptyList());
//        }
//
//        //收包投缺陷
//        List<OperateQualityDefectInfo> sbtDefectData = produceOperateMapper.getSbtDefect(startTime, endTime);
//        if (CollectionUtils.isNotEmpty(sbtDefectData)) {
//            allDefectData.addAll(sbtDefectData);
//            qInfo.setSbtDefect(sbtDefectData);
//            processDefectRate(sbtDefectData, qInfo.getSbtNum());
//        } else {
//            qInfo.setSbtDefect(Collections.emptyList());
//        }
//
//        //在清洗缺陷
//        List<OperateQualityDefectInfo> zqxDefectData = produceOperateMapper.getZqxDefect(startTime, endTime);
//        if (CollectionUtils.isNotEmpty(zqxDefectData)) {
//            allDefectData.addAll(zqxDefectData);
//            qInfo.setZqxDefect(zqxDefectData);
//            processDefectRate(zqxDefectData, qInfo.getZqxNum());
//        } else {
//            qInfo.setZqxDefect(Collections.emptyList());
//        }
//
//        //成品返投缺陷
//        List<OperateQualityDefectInfo> cpftDefectData = produceOperateMapper.getCpftDefect(startTime, endTime);
//        if (CollectionUtils.isNotEmpty(cpftDefectData)) {
//            allDefectData.addAll(cpftDefectData);
//            qInfo.setCpftDefect(cpftDefectData);
//            processDefectRate(cpftDefectData, qInfo.getCpftNum());
//        } else {
//            qInfo.setCpftDefect(Collections.emptyList());
//        }
//
//        //热端丢板-功耗数
//        int ghNum = produceOperateMapper.getHotGhDiscardBoardNum(start, end);
//        //热端丢板-品质数
//        int pzNum = 0;
//        HotGlassDefectNum hotGlassDefectNum = produceOperateMapper.getHotPzDefectDiscardBoardNum(startTime, endTime);
//        int qtNum = produceOperateMapper.getHotQtDefectDiscardBoardNum(start, end);
//        if (hotGlassDefectNum != null) {
//            pzNum = hotGlassDefectNum.getBubbleNum() + hotGlassDefectNum.getStoneNum() + qtNum;
//        }
//        qInfo.setHotDiscardBoardNum(ghNum + pzNum);
//        //热端丢板占比
//        if (qInfo.getHqNum() > 0 && qInfo.getHotDiscardBoardNum() > 0) {
//            qInfo.setHotDiscardBoardRate(divideAndRound(qInfo.getHotDiscardBoardNum(), qInfo.getHqNum()));
//        }
//
//        //综合良率
//        double compRate = (qInfo.getZtLpNum() + ((divideAndRound(qInfo.getSbtLpNum(), qInfo.getSbtNum())) * qInfo.getBcpSbNum()) + ((divideAndRound(qInfo.getZqxLpNum(), qInfo.getZqxTrNum())) * (qInfo.getZtZqxNum() + qInfo.getSbtLpNum()))) / qInfo.getHqNum();
//        qInfo.setCompRate(roundDouble(compRate, 3));
//
//        //全部缺陷
//        if (CollectionUtils.isNotEmpty(allDefectData)) {
//            List<OperateQualityDefectInfo> defectData = new ArrayList<>();
//            Map<String, List<OperateQualityDefectInfo>> defectMap = allDefectData.stream().collect(Collectors.groupingBy(OperateQualityDefectInfo::getDefectName));
//            defectMap.forEach((k, v) -> {
//                OperateQualityDefectInfo defectInfo = new OperateQualityDefectInfo();
//                defectInfo.setDefectName(k);
//                int count = 0;
//                for (OperateQualityDefectInfo operateQualityDefectInfo : v) {
//                    count += operateQualityDefectInfo.getNum();
//                }
//                defectInfo.setNum(count);
//                defectData.add(defectInfo);
//            });
//            qInfo.setTotalDefect(defectData.stream().sorted(Comparator.comparing(OperateQualityDefectInfo::getNum).reversed()).collect(Collectors.toList()));
//        }
//        return qInfo;
//    }
//
//    // 将 double 值保留指定小数位数的方法
//    public static double roundDouble(double value, int decimalPlaces) {
//        // 将 value 乘以 10 的 decimalPlaces 次方，以将指定小数位数移到整数部分
//        double multiplier = Math.pow(10, decimalPlaces);
//        return Math.round(value * multiplier) / multiplier;
//    }
//
//
//    /**
//     * @Description: 计算缺陷占比
//     * @version v1.0
//     * @author songJinKang
//     * @date 2024-04-08 19:17
//     */
//    public void processDefectRate(List<OperateQualityDefectInfo> defectDate, int defectTotalNum) {
//        for (OperateQualityDefectInfo operateQualityDefectInfo : defectDate) {
//            if (defectTotalNum > 0 && operateQualityDefectInfo.getNum() > 0) {
//                operateQualityDefectInfo.setRate(divideAndRound(operateQualityDefectInfo.getNum(), defectTotalNum));
//            }
//        }
//    }
//
//    public static double divideAndRound(double dividend, double divisor) {
//        if (dividend != 0 && divisor != 0) {
//            BigDecimal bdDividend = BigDecimal.valueOf(dividend);
//            BigDecimal bdDivisor = BigDecimal.valueOf(divisor);
//            BigDecimal bdResult = bdDividend.divide(bdDivisor, 2, BigDecimal.ROUND_HALF_UP);
//            bdResult = bdResult.multiply(new BigDecimal(100));
//            bdResult = bdResult.setScale(2, BigDecimal.ROUND_HALF_UP);
//            return bdResult.doubleValue();
//        }
//        return 0;
//    }
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
